package sort;
/*
* 15. 三数之和
*    排序加双指针
*   排序用来去重, 双指针用来降低时间复杂度
*   使用map可以代替双指针但是增加了空间复杂度
*
* */

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ThreeSum15 {
    public List<List<Integer>> threeSum(int[] nums) {
        int n=nums.length;
        if(n<=2){
            return new ArrayList<>();
        }
        Arrays.sort(nums);
        List<List<Integer>> res=new ArrayList<>();
        for(int first=0;first<n;first++){
            //需要和上一次枚举的数不同,节省时间
            if(first>0 && nums[first]==nums[first-1]){
                continue;
            }
            int third=n-1;
            int target=-nums[first];
            for(int second=first+1;second<n;second++){
                if(second>first+1 && nums[second]==nums[second-1]){
                    continue;
                }
                while(second<third && nums[second]+nums[third]>target){
                    third--;
                }
                if(second==third){
                    break;
                }
                if(nums[second]+nums[third]==target){
                    List<Integer> list=new ArrayList<>();
                    list.add(nums[first]);
                    list.add(nums[second]);
                    list.add(nums[third]);
                    res.add(list);
                }
            }
        }
        return res;
    }
}
